'''
#### 题目描述

编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为：对于一个正整数，
每一次将该数替换为它每个位置上的数字的平方和，然后重复这个过程直到这个数变为 1，
也可能是无限循环但始终变不到 1。如果可以变为 1，那么这个数就是快乐数。
```
示例: 
输入: 19
输出: true
解释: 
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
```
#### 分析实现
这道题目思路很明显，当n不等于1时就循环，每次循环时，将其最后一位到第一位的数依次平方求和，比较求和是否为1。
难点在于，什么时候跳出循环？
开始笔者的思路是，循环个100次，还没得出结果就false，但是小学在算无限循环小数时有一个特征，
就是当除的数中，和之前历史的得到的数有重合时，这时就是无限循环小数。
那么这里也可以按此判断，因为只需要判断有或无，
不需要记录次数，故用set的数据结构。每次对求和的数进行append，
当新一次求和的值存在于set中时，就return false.
'''
class Solution:
    def isHappy(self, n: int) -> bool:
        already = set()
        """
        0+ 9**2
        81
        0+1**2
        8
        """
        while n != 1:
            sum =0
            while n>0:
                tmp = n % 10
                sum += tmp**2
                n //=10
            if sum in already:
                return False
            else:
                already.add(sum)
            n = sum
        return True
